package com.holyn.guofang.model.webhttp.observable;

import com.holyn.guofang.model.webhttp.wo.AlgorismTypeWo;
import com.holyn.guofang.model.webhttp.wo.AlgorismWo;
import com.holyn.guofang.model.webhttp.wo.BrandBulletinWo;
import com.holyn.guofang.model.webhttp.wo.BrandGoodsWo;
import com.holyn.guofang.model.webhttp.wo.BrandInfoWo;
import com.holyn.guofang.model.webhttp.wo.BrandItemInfoWo;
import com.holyn.guofang.model.webhttp.wo.BrandProcessWo;
import com.holyn.guofang.model.webhttp.wo.GraphTransWo;
import com.holyn.guofang.model.webhttp.wo.ImageMergeWo;
import com.holyn.guofang.model.webhttp.wo.ImagePartitionWo;
import com.holyn.guofang.model.webhttp.wo.ImageSimilarWo;
import com.holyn.guofang.model.webhttp.wo.ImageWo;
import com.holyn.guofang.model.webhttp.wo.StatusWo;
import com.holyn.guofang.model.webhttp.wo.TaskIDWo;
import com.holyn.guofang.model.webhttp.wo.TaskWo;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
 * Created by Holyn on 2017/6/22.
 */

public interface BrandObservable {

    /**
     * 获取任务 ID。
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("getTaskID.ashx")
    Observable<TaskIDWo> getTaskID(@Field("userName") String userName);

    /**
     * 上传图片。必须使用 post 方法，图片流就是类似于 HTML 表单里的“<input type="file". . . >” 的元素，
     * 名称除了以下参数名使用了的以外任意都可以。
     *
     * @param multipartBody 包含platformType，isWeb，userID，loginID，rand，checkCode
     * @return
     */
    @POST("uploadFile.ashx")
    Observable<ImageWo> uploadFile(
            @Body MultipartBody multipartBody
    );

    /**
     * 获取算法分类列表。
     *
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("algorismType.ashx")
    Observable<AlgorismTypeWo> algorismType(
            @Field("userName") String userName
    );

    /**
     * 获取算法项目列表。
     *
     * @param typeCode 分类标识
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("algorism.ashx")
    Observable<AlgorismWo> algorism(
            @Field("typeCode") String typeCode
    );

    /**
     * 获取某一商标信息。
     *
     * @param MarkNo 注册号
     * @param MarkClass 类别
     * @return
     */
    @FormUrlEncoded
    @POST("getTmInfbyMarkNo.ashx")
    Observable<BrandInfoWo> getTmInfbyMarkNo(
            @Field("MarkNo") String MarkNo,
            @Field("MarkClass") Integer MarkClass
    );

    /**
     * 获取某一商标商品明细信息。(商标详情-右上角的查看商品服务)
     *
     * @param MarkNo 注册号
     * @param MarkClass 类别
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("getMarkGoods.ashx")
    Observable<BrandGoodsWo> getMarkGoods(
            @Field("MarkNo") String MarkNo,
            @Field("MarkClass") Integer MarkClass
    );

    /**
     * 获取某一商标流程信息。(商标详情-顶部的查看事物流程)
     *
     * @param MarkNo 注册号
     * @param MarkClass 类别
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("getMarkProcess.ashx")
    Observable<BrandProcessWo> getMarkProcess(
            @Field("MarkNo") String MarkNo,
            @Field("MarkClass") Integer MarkClass
    );

    /**
     * 获取某一商标公告信息。(商标详情-左上角的查看商标公告)
     *
     * @param MarkNo 注册号
     * @param MarkClass 类别
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("getBulletinInfo.ashx")
    Observable<BrandBulletinWo> getBulletinInfo(
            @Field("MarkNo") String MarkNo,
            @Field("MarkClass") Integer MarkClass
    );

    /**
     * 商标原图分拆能力。必须使用 post 方法，(分拆组合)
     * 图片流就是类似于 HTML 表单里的“<input type="file". . . >”的元素，
     * 名称除了以下参数名使用了的以外任意都可以。
     *
     * @param SrcImgID 商标源图 ID(若该值不为空则直接用该值作为图 片路径，不需要传文件流)
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("imgPartition.ashx")
    Observable<ImagePartitionWo> imgPartition(
            @Field("SrcImgID") String SrcImgID
    );

    /**
     * 生成分拆子图能力。必须使用 post 方法，(分拆组合-预览分拆组合结果)
     * 图片流就是类似于 HTML 表单里的“<input type="file". . . >”的元素，
     * 名称除了以下参数名使用了的以外任意都可以。
     *
     * @param SrcImgID 商标源图 ID(若该值不为空则直接用该值作为图 片路径，不需要传文件流)
     * @param Num 商标分拆组合数据，具体含义请参考《国方商标识 别手 WebService 接口文档》
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     *
     */
    @FormUrlEncoded
    @POST("imgMerge.ashx")
    Observable<ImageMergeWo> imgMerge(
            @Field("SrcImgID") String SrcImgID,
            @Field("Num") String Num
    );

    /**
     * 执行商标近似图样查询任务。必须使用 post 方法，(替换追加)
     * 图片流就是类似于 HTML 表单里的“<input type="file". . . >”的元素，
     * 名称除了以下参数名使用了的以外任意都可以。
     *
     * @param SrcImgID 商标源图 ID(非图片流，若该值为空或空字符串， 则需要传一个图片流)
     * @param ImgIDs 其它图文件名，可以是多个，可空，多个时用“;” 分割
     * @param TopCount 需要识别出前 n 件近似图样(n 分为:12，60，120， 240，480，960)
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("getSimilarImg.ashx")
    Observable<ImageSimilarWo> getSimilarImg(
            @Field("SrcImgID") String SrcImgID,
            @Field("ImgIDs") String ImgIDs,
            @Field("TopCount") Integer TopCount
    );

    /**
     * 2.4.12
     * (商标识别)
     * 执行商标识别任务。必须使用 post 方法，
     * 图片流就是类似于 HTML 表单里的“<input type="file". . . >”的元素，
     * 名称除了以下参数名使用了的以外任意都可以。
     *
     * @param TaskID 任务 ID，由客户端请求前产生
     * @param FrontCount 首次返回前面记录数量
     * @param QueryMode 查询方式
     * @param SrcImgID 商标源图 ID(非图片流，若该值为空或空字符串， 则需要传一个图片流)
     * @param ImgIDs 其它图文件名，可以是多个，可空，多个时用“;” 分割
     * @param CnContent 商标的中文文字
     * @param EnContent 商标的英文文字
     * @param ImageCode 商标的图形要素图形要素编码
     * @param MarkClass 类别
     * @param MarkGroup 群组
     * @param ImageQueryMode 图像识别查询算法类型
     * @param ImageAlgorithm 图像识别的查询算法
     * @param CnQueryMode 中文查询算法类型
     * @param CnAlgorithm 中文的查询算法
     * @param EnQueryMode 西文查询算法类型
     * @param EnAlgorithm 英文的查询算法
     * @param CodeQueryMode 图形要素编码查询算法类型
     * @param CodeAlgorithm 图形要素编码的查询算法
     * @param State 状态过滤
     * @param DateType 过滤日期
     * @param BeginDate 过滤起始日期
     * @param EndDate 过滤截止日期
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("searchByImg.ashx")
    Observable<BrandItemInfoWo> searchByImg(
            @Field("TaskID") Integer TaskID,
            @Field("FrontCount") Integer FrontCount,
            @Field("QueryMode") String QueryMode,
            @Field("SrcImgID") String SrcImgID,
            @Field("ImgIDs") String ImgIDs,
            @Field("CnContent") String CnContent,
            @Field("EnContent") String EnContent,
            @Field("ImageCode") String ImageCode,
            @Field("MarkClass") String MarkClass,
            @Field("MarkGroup") String MarkGroup,
            @Field("ImageQueryMode") String ImageQueryMode,
            @Field("ImageAlgorithm") String ImageAlgorithm,
            @Field("CnQueryMode") String CnQueryMode,
            @Field("CnAlgorithm") String CnAlgorithm,
            @Field("EnQueryMode") String EnQueryMode,
            @Field("EnAlgorithm") String EnAlgorithm,
            @Field("CodeQueryMode") String CodeQueryMode,
            @Field("CodeAlgorithm") String CodeAlgorithm,
            @Field("State") String State,
            @Field("DateType") String DateType,
            @Field("BeginDate") String BeginDate,
            @Field("EndDate") String EndDate
    );

    /**
     * 2.4.13
     * 请求获取商标查询结果
     * 根据TaskID请求获取商标查询结果。
     *
     * @param TaskID 任务 ID
     * @param SortType 结果返回的排序方式
     * @param BeginRow 起始行
     * @param EndRow 结束行
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("getSearchResultByTaskID.ashx")
    Observable<BrandItemInfoWo> getSearchResultByTaskID(
            @Field("TaskID") Integer TaskID,
            @Field("SortType") String SortType,
            @Field("BeginRow") Integer BeginRow,
            @Field("EndRow") Integer EndRow
    );

    /**
     * 2.4.14
     * 提交商标查询任务。(商标查询)
     *
     * @param TaskID 任务 ID，由客户端请求前产生
     * @param FrontCount 首次返回前面记录数量
     * @param SearchMode 查询模式(0:混合，1:图形特征，2:文字内容)
     * @param SearchType 查询条件类型
     * @param Content 查询条件内容
     * @param MarkClass 类别
     * @param MarkGroup 群组
     * @param QueryMode 查询方式 (混合、近似、自定义)
     * @param Algorithm 查询算法, 根据参数“QueryMode”确定具体参数 请查阅《查询算法》
     * @param State 状态过滤(全部、有效、无效、待定)
     * @param DateType 过滤日期(不过滤、申请日期、初审公告日、注册 公告日)
     * @param BeginDate 过滤起始日期，DateType 为“不过滤”时此值为 空，日期格式为:yyyy-mm-dd
     * @param EndDate 过滤截止日期，DateType 为“不过滤”时此值为 空，日期格式为:yyyy-mm-dd
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("searchTradeMarkInfo.ashx")
    Observable<BrandItemInfoWo> searchTradeMarkInfo(
            @Field("TaskID") Integer TaskID,
            @Field("FrontCount") Integer FrontCount,
            @Field("SearchMode") String SearchMode,
            @Field("SearchType") String SearchType,
            @Field("Content") String Content,
            @Field("MarkClass") String MarkClass,
            @Field("MarkGroup") String MarkGroup,
            @Field("QueryMode") String QueryMode,
            @Field("Algorithm") String Algorithm,
            @Field("State") String State,
            @Field("DateType") String DateType,
            @Field("BeginDate") String BeginDate,
            @Field("EndDate") String EndDate
    );

    /**
     * 2.4.15 获取用户的任务信息列表
     * @param pageSize 每页记录数
     * @param page 页码
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配，-6:无任务记 录)
     */
    @FormUrlEncoded
    @POST("getTaskList.ashx")
    Observable<TaskWo> getTaskList(
            @Field("pageSize") Integer pageSize,
            @Field("page") Integer page
    );

    /**
     * 获取任务结果。
     * 本接口是对前端商标查询结果进行过滤处理。
     *
     * @param TaskID 任务 ID
     * @param State 状态标识(0:有效，1:无效，2:期满待定，3:无 效待定，4:全部)
     * @param MarkKeyStr 已选商标记录的标识集合。用“;”分隔，标识由 “类别 _ 注册号”组成
     * @param MarkGroup 群组。用“;”分隔
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配)
     */
    @FormUrlEncoded
    @POST("getTMByFilter.ashx")
    Observable<BrandItemInfoWo> getTMByFilter(
            @Field("TaskID") Integer TaskID,
            @Field("State") Integer State,
            @Field("MarkKeyStr") String MarkKeyStr,
            @Field("MarkGroup") String MarkGroup
    );

    /**
     * 2.4.17 获取任务支付验证码
     * 获取任务支付验证码。只有在用户启用国方卡时使用验证码验证才有效。
     *
     * @param userName
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配，
     *          -6:同一设备 一分钟内验证超过 1 次，-7:验证方法不是选择验 证码验证)
     */
    @FormUrlEncoded
    @POST("getTaskPayCode.ashx")
    Observable<StatusWo> getTaskPayCode(
            @Field("userName") String userName
    );

    /**
     * 2.4.18 任务支付
     *
     * @param taskID 任务 ID
     * @param validCode 设置为密码验证时的密码(经32位MD5加密)，设 置为验证码验证时手机号码或电子邮箱接收到的验 证码
     * @return
     *
     * 操作是否成功(1:是，0:否，-1:用户不存在，-2: 登录信息不存在，-3:用户 ID 与登录信息不匹配， -4:登录已过期，-5:验证码不匹配，
     *          -6:输入的密 码或手机、邮箱收到的验证码不匹配)
     */
    @FormUrlEncoded
    @POST("taskPay.ashx")
    Observable<StatusWo> taskPay(
            @Field("taskID") Integer taskID,
            @Field("validCode") String validCode
    );


    /**
     * 2.4.19 获取检索内容接口
     *
     * 功能说明：获取检索内容接口（图转文）。
     * 功能操作地址：GraphTranslation.ashx
     *
     * @param SrcImgID 调用图片上传接口成功后返回的图片ID（不含扩展名）
     *
     * 操作是否成功（1：是，0：否，-1：用户不存在，-2：登录信息不存在，
     *                 -3：用户 ID 与登录信息不匹配，-4：登录已过期，-5：验证码不匹配）
     */
    @FormUrlEncoded
    @POST("GraphTranslation.ashx")
    Observable<GraphTransWo> graphTranslation(
            @Field("SrcImgID") String SrcImgID,
            @Field("isAutoImgToWord") Integer isAutoImgToWord,
            @Field("isAutoImgToImgbasic") Integer isAutoImgToImgbasic,
            @Field("UnionType") String UnionType
    );
}
